package io.shockah.skylark.ident.nickserv; import io.shockah.skylark.Bot; import io.shockah.skylark.event.AccountNotifyEvent; import io.shockah.skylark.event.ExtendedJoinEvent; import io.shockah.skylark.ident.IdentMethodFactory; import io.shockah.skylark.ident.IdentPlugin; import io.shockah.skylark.ident.IdentService; import io.shockah.skylark.plugin.ListenerPlugin; import io.shockah.skylark.plugin.PluginManager; import java.util.List; import org.pircbotx.Channel; import org.pircbotx.hooks.events.JoinEvent; import org.pircbotx.hooks.events.NickChangeEvent; import org.pircbotx.hooks.events.NoticeEvent; import org.pircbotx.hooks.events.PartEvent; import org.pircbotx.hooks.events.QuitEvent; import org.pircbotx.hooks.events.ServerResponseEvent; public class NickServIdentPlugin extends ListenerPlugin { @Dependency protected IdentPlugin identPlugin; private IdentMethodFactory factory; public NickServIdentPlugin(PluginManager manager, Info info) { super(manager, info); } @Override protected void onLoad() { identPlugin.register(factory = new NickServIdentMethod.Factory()); } @Override protected void onAllPluginsLoaded() { manager.app.serverManager.botManagers.iterate(botManager -> { if (!botManager.bots.isEmpty()) { IdentService service = botManager.getService(IdentService.class); NickServIdentMethod method = service.getMethod(NickServIdentMethod.class); if (method == null || !method.isAvailable() || !method.hasWhoX()) return; botManager.bots.iterate(bot -> { for (Channel channel : bot.getUserBot().getChannels()) { bot.sendRaw().rawLine(String.format("WHO %s %%na", channel.getName())); } }); } }); } @Override protected void onUnload() { identPlugin.unregister(factory); } public IdentMethodFactory getIdentMethodFactory() { return factory; } @Override protected void onNotice(NoticeEvent e) { if (!e.getUser().getNick().equals("NickServ")) return; IdentService service = e.<Bot>getBot().manager.getService(IdentService.class); NickServIdentMethod method = service.getMethod(NickServIdentMethod.class); if (method == null || !method.isAvailable()) return; String[] spl = e.getMessage().split(" "); if (spl[1].equals("->") && (!spl[2].equals("0") && !spl[2].equals("*")) && spl[4].equals("3")) method.onNickServNotice(spl[0], spl[2]); else method.onNickServNotice(spl[0], null); } @Override protected void onAccountNotify(AccountNotifyEvent e) { IdentService service = e.<Bot>getBot().manager.getService(IdentService.class); NickServIdentMethod method = service.getMethod(NickServIdentMethod.class); if (method != null && method.isAvailable()) { method.onAccountNotify(e.getUser().getNick(), e.getAccount()); } } @Override protected void onExtendedJoin(ExtendedJoinEvent e) { IdentService service = e.<Bot>getBot().manager.getService(IdentService.class); NickServIdentMethod method = service.getMethod(NickServIdentMethod.class); if (method != null && method.isAvailable()) method.onExtendedJoin(e.getUser().getNick(), e.getAccount()); } @Override protected void onJoin(JoinEvent e) { IdentService service = e.<Bot>getBot().manager.getService(IdentService.class); NickServIdentMethod method = service.getMethod(NickServIdentMethod.class); if (method == null || !method.isAvailable()) return; if (method.hasWhoX() && e.getUser() == e.getBot().getUserBot()) e.getBot().sendRaw().rawLine(String.format("WHO %s %%na", e.getChannel().getName())); } @Override protected void onNickChange(NickChangeEvent e) { IdentService service = e.<Bot>getBot().manager.getService(IdentService.class); NickServIdentMethod method = service.getMethod(NickServIdentMethod.class); if (method != null && method.isAvailable()) method.onNickChange(e.getOldNick(), e.getNewNick()); } @Override protected void onQuit(QuitEvent e) { IdentService service = e.<Bot>getBot().manager.getService(IdentService.class); NickServIdentMethod method = service.getMethod(NickServIdentMethod.class); if (method != null && method.isAvailable()) method.onQuit(e.getUser().getNick()); } @Override protected void onPart(PartEvent e) { Bot bot = e.getBot(); IdentService service = bot.manager.getService(IdentService.class); NickServIdentMethod method = service.getMethod(NickServIdentMethod.class); if (method == null || !method.isAvailable()) return; String nick = e.getUser().getNick(); Bot foundBot = bot.manager.bots.filterFirst(bot2 -> { for (Channel channel : bot2.getUserBot().getChannels()) { if (channel.getUsersNicks().contains(nick)) return true; } return false; }); if (foundBot == null) method.onQuit(nick); } @Override protected void onServerResponse(ServerResponseEvent e) { if (e.getCode() != 354) return; IdentService service = e.<Bot>getBot().manager.getService(IdentService.class); NickServIdentMethod method = service.getMethod(NickServIdentMethod.class); if (method == null || !method.isAvailable()) return; List<String> response = e.getParsedResponse(); if (response.size() == 3) method.onServerResponseEntry(response.get(1), response.get(2)); } }